package org.spring.bean.factory.config;

import org.spring.bean.factory.BeanFactory;
import org.spring.bean.factory.HierarchicalBeanFactory;
import org.spring.bean.factory.ListableBeanFactory;
import org.spring.core.Ordered;

/**
 * 由大多数bean工厂实现的配置接口。提供配置bean工厂的工具，以及{@link BeanFactory}接口。
 * <p>
 * 这个bean工厂接口不应该在普通的应用程序代码中使用:坚持使用{@link BeanFactory} 或{@link ListableBeanFactory}用于典型需求。
 * 这个扩展接口只是为了允许框架内部的即插即用和对bean工厂配置方法的特殊访问。
 *
 * @author 李坤
 * @date 2022/4/23 19:16
 */
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {

    /**
     * 添加一个新的 BeanPostProcessor，它将应用于此工厂创建的 bean。在工厂配置期间调用。
     * <p>
     * 注：此处提交的后处理器将按注册顺序申请；通过实现 {@link Ordered} 接口表达的任何排序语义都将被忽略。
     * 请注意，自动检测到的后处理器（例如作为 ApplicationContext 中的 bean）将始终在以编程方式注册的后处理器之后应用。
     *
     * @param beanPostProcessor 要注册的后处理器
     */
    void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

    /**
     * 返回当前注册的 BeanPostProcessor 的数量，如果有的话。
     */
    int getBeanPostProcessorCount();

    /**
     * 为给定的 bean 注册一个依赖 bean，在给定的 bean 被销毁之前被销毁。
     *
     * @param beanName          bean 的名字
     * @param dependentBeanName 依赖 bean 的名称
     *
     * @since 2.5
     */
    void registerDependentBean(String beanName, String dependentBeanName);

    /**
     * 返回依赖于指定 bean 的所有 bean 的名称（如果有）。
     *
     * @param beanName bean 的名字
     *
     * @return 依赖 bean 名称的数组，如果没有，则为空数组
     *
     * @since 2.5
     */
    String[] getDependentBeans(String beanName);

    /**
     * 返回指定 bean 所依赖的所有 bean 的名称（如果有）。
     *
     * @param beanName bean 的名字
     *
     * @return bean 所依赖的 bean 名称数组，如果没有则为空数组
     *
     * @since 2.5
     */
    String[] getDependenciesForBean(String beanName);

}
